iT邦幫忙

2022 iThome 鐵人賽

DAY 27
0
自我挑戰組

利用30天學習JavaScript&Node.js系列 第 27

Day27- 使用內建fs模組進行檔案操作吧!

  • 分享至 

  • xImage
  •  

今天會來介紹一個叫做fs的Node模組,這個模組可以進行檔案操作,有點像是python的os模組,在需要進行大量的檔案操作時,可以藉由這個套件來撰寫程式,簡化人力操作。這個套件是內建的,直接require就好(或import):

const fs = require('fs');

接下來就來看看這些套件可以做到甚麼吧!

創建資料夾-fs.mkdir()

我們可以利用fs.mkdir()來創建資料夾,用法很簡單,參數的部分可以放入三個參數分別是path、mode以及callback,mode會用來設定資料夾的權限,基本上很少用到,path我們可以輸入當前路徑,callback通常會用來告知有無錯誤或用來告知資料夾創建成功:

const fs = require('fs');

let dir = 'Test';

fs.mkdir(`./${dir}`, (err) => {
    if(!err) console.log(`資料夾${dir}創建成功!!!`);
    else throw new Error(err);
});

我先將資料夾名稱用一個變數儲存,再利用函式創建。這邊我的路徑使用相對路徑,絕對路徑也是可以的。

https://ithelp.ithome.com.tw/upload/images/20221009/20138060b5BZfQmMQS.png

https://ithelp.ithome.com.tw/upload/images/20221009/20138060bOTiFE2YTM.png

可以看到資料夾就被創建出來了。

(創建)寫入檔案-fs.writeFile()

創建檔案可以使用的fs.writeFile(),這是用來寫入資料的函式,當目標檔案不存在時就會創建檔案。參數有file、data、options、 callback四個,file跟前面的path一樣都是路徑,data是寫入的資料,options則是encoding(編碼模式),mode以及後面會講到的flags的集合,這個參數跟前面的mode一樣是可選的。

const fs = require('fs');

let dir = './Test/test.txt';
let data = 'Hello world!'

fs.writeFile(dir, data, (err) => {
    if(!err) console.log('創建檔案成功!!!');
    else throw new Error(err);
});

https://ithelp.ithome.com.tw/upload/images/20221009/20138060uDkuWYOVU8.png

https://ithelp.ithome.com.tw/upload/images/20221009/20138060v0ptsViem4.png

這樣就能創建檔案並寫入資料了喔!

讀取檔案-fs.readFile()

fs.readFile()用來讀取檔案,這個函式有四個參數,分別是path、options以及callback,path跟前面一樣,比較特殊的是剛剛沒講到的options中的flags,flags用來選擇讀取檔案的模式geeksforgeeks上有蠻完整的表格,分別告訴你不同模式代表的意思:

!https://ithelp.ithome.com.tw/upload/images/20221009/20138060H5wrSWIbQs.png

fs.readFile()的callback有兩個參數,除了err錯誤外,還有data這個參數,也就是讀取檔案內的資料:

const fs = require('fs');

let dir = './Test/test.txt';

fs.readFile(dir, [flag = 'r'], (err, data) => {
    if(!err) console.log(data.toString());
    else throw new Error(err);
});

https://ithelp.ithome.com.tw/upload/images/20221009/20138060cicZlGdeop.png

可以看到這樣就可以用r模式讀取檔案的值了。

更改檔案名字-fs.rename()

我們也能利用fs.rename()來更改檔案名稱,分別有三個參數oldPath、newPath、callback,oldPath以及newPath顧名思義是舊路徑以及新路徑,直接看例子:

const fs = require('fs');

let oldPath = './Test/test.txt';
let newPath = './Test/newTest.txt';

fs.rename(oldPath, newPath, (err) => {
    if(!err) console.log("改名成功");
    else throw new Error(err);
});

https://ithelp.ithome.com.tw/upload/images/20221009/20138060BbUxfRAduD.png

https://ithelp.ithome.com.tw/upload/images/20221009/20138060oH1TOJxTjt.png

刪除檔案-fs.unlink()以及刪除資料夾-fs.rmdir()

fs.unlink()用來刪除檔案,只有兩個參數,分別是path,也就是刪除的檔案路徑以及callback-回傳函式,如果我要刪除剛剛的newTest.txt的話,我可以這樣寫:

const fs = require('fs');

let path = './Test/newTest.txt';

fs.unlink(path, (err) => {
    if(!err) console.log("刪除檔案成功");
    else throw new Error(err);
});

https://ithelp.ithome.com.tw/upload/images/20221009/201380603Znk4KQlQc.png

https://ithelp.ithome.com.tw/upload/images/20221009/20138060pAHy1x2cvF.png

fs.rmdir()用來刪除資料夾,參數一樣有三個-path、options以及callback,這邊的options的功能是在刪除料夾時的細節,也是可選參數,有maxRetries、recursive跟retryDelay,詳細可以看官網,像是若我要刪除剛剛的Test資料夾,我可以這樣寫:

const fs = require('fs');

let path = './Test';

fs.rmdir(path, (err) => {
    if(!err) console.log("刪除資料夾成功");
    else throw new Error(err);
});

https://ithelp.ithome.com.tw/upload/images/20221009/20138060nADBpGtVLm.png

https://ithelp.ithome.com.tw/upload/images/20221009/20138060NoZHGR1kb0.png

同步檢查路徑是否存在-fs.existsSync()

這個函示會用同步的方式檢查路徑上的指定檔案(或資料夾)是否存在,存在就回傳true,否則就回傳false。參數為要檢查的路徑,整體用起來還還蠻直覺的:

const fs = require('fs');

fileExists1 = fs.existsSync('./z.txt');
fileExists2 = fs.existsSync('./y');
fileExists3 = fs.existsSync('./x.txt');

console.log(fileExists1);
console.log(fileExists2);
console.log(fileExists3);

https://ithelp.ithome.com.tw/upload/images/20221009/20138060OVvxeOJ1MZ.png

https://ithelp.ithome.com.tw/upload/images/20221009/201380607qGXV0FfSs.png

這些函式其實就很夠用了,其他像是fs.open()或是fs.close()、fs.read()等等的方式基本上跟readFile的重複性太高,等後面不得已需要用到時再補充,明天應該會利用這個套件結合爬蟲套件來做到下載圖片的程式。


上一篇
Day26- 利用JavaScript進行爬蟲吧!
下一篇
Day28- 回來寫爬蟲吧!下載圖片實戰
系列文
利用30天學習JavaScript&Node.js30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言